home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / disgas / disgas.doc < prev    next >
Encoding:
Text File  |  1993-07-08  |  6.3 KB  |  133 lines

  1. 386用逆アセンブラ:DISGAS.EXE Ver.1.00    By Jouji
  2.  
  3. ◆プログラム概要
  4.  このプログラムはCPU386のプロテクトモード、32ビットアドレッシングプ
  5. ログラムのバイナリイメージをGAS(GNUアセンブラ)形式のニーモニックに変
  6. 換するためのものです。要するに、*.EXP、*.OBJ、*.Oファイル等を逆
  7. アセンブルして解析するためのものです。
  8.  私はFM-TOWNS2UX20のユーザーですが、現在UXのユーザーは結構多
  9. いのではないでしょうか。UXのユーザーの方はご存知でしょうが、UXではBAS
  10. ICコンパイラV1.1L21でコンパイルした*.EXPのプログラムが動きませ
  11. ん。フリコレ3~5にはこのようなプログラムが結構あって、起動しようとしたら画
  12. 面が真っ暗になってそのままハングアップという経験をお持ちの方もたくさんいらっ
  13. しゃることと思います。L21Dで再コンパイルしていただければ動くようになるの
  14. ですが、L21D版が出ないものも結構あるようです。
  15.  自分のマシンで動かないプログラムがあるということは気になるものです。Oh!
  16. FM-TOWNSによるとプログラムの起動時に数値演算コプロセッサ387の識別
  17. に失敗してハングアップしているということです。それならプログラムにパッチを当
  18. てて、387の識別の所を強制的に387無し(UXでは387は付けられないので)
  19. としてしまえばよいのではないかと考えた訳です。しかし、*.EXPプログラムの
  20. 解析をしようにも386対応のデバッガが無い!仕方がないのでSYMDEB.EX
  21. Eを使ってみました。そしたら、もう大変。オペランドのサイズが2バイトと4バイ
  22. トというように違うので、これを解析するのには気の遠くなるような手間がかかりそ
  23. うです。そこで一念発起、逆アセンブラを作ってしまえという訳でできたのがこのプ
  24. ログラムです。
  25.  
  26.  
  27. ◆起動方法
  28.  プログラムはLSI-C86試食版によってコンパイルされており、MS-DOS
  29. 汎用です。T-OSのコマンドモードあるいはMS-DOSのコマンドラインから次
  30. のようにして起動してください。
  31.  
  32.   disgas [-d] [-sHex_num] [-eHex_num] [-aHex_num] File_name
  33.  
  34.  対象のファイル名はLSI-C86のワイルドカード展開機能に合致するワイルド
  35. カード文字が使用できます。ただし処理の対象となるのはワイルドカードの展開を行
  36. ってソートされた一番最初のファイルだけです。
  37.  オプションの意味は次の通りです。
  38.  
  39.   -d:逆アセンブルリストにコードのダンプデータを付加する。
  40.   -s:逆アセンブル開始位置指定。ファイル先頭からのオフセットを表す16進
  41.     データを付ける。
  42.   -e:逆アセンブル終了位置指定。ファイル先頭からのオフセットを表す16進
  43.     データを付ける。
  44.   -a:逆アセンブル開始位置におけるアドレス(EIPの値)指定。アドレスを
  45.     表す16進データを付ける。
  46.  
  47. オプションは全て省略可能であり、省略した場合の動作は、ダンプデータは無し、
  48. -s0 -effffffff -a0 と同じになります。
  49.  
  50.  
  51. ◆動作
  52.  このプログラムは、対象プログラムのデフォルトのオペランドサイズ、アドレスサ
  53. イズが32ビットであるとして逆アセンブルします。オペランドサイズプリフィック
  54. スは一応サポートしていますが、疑似ニーモニック「opsize」を出力する仕様になっ
  55. ています。アドレスサイズプリフィックスは全くサポートしていません。疑似ニーモ
  56. ニック「adsize」を出力するだけで、16ビットアドレッシングのニーモニックは発
  57. 生しません。16ビットアドレッシングなんてあまり使わないんじゃないかと思った
  58. ものですから。
  59.  逆アセンブルリストは標準出力に出力されます。ファイルに出力する場合はリダイ
  60. レクトしてください。ダンプデータ付きの出力は次のようになります。
  61.  
  62. TEST.O
  63. _00000000: nop                                      #90
  64. _00000001: nop                                      #90
  65. _00000002: movl    %cr0,%eax                        #0F 20 C0
  66. _00000005: movl    %cr2,%eax                        #0F 20 D0
  67. _00000008: movl    %cr3,%eax                        #0F 20 D8
  68. _0000000b: movb    $0x01,%al                        #B0 01
  69. _0000000d: opsize                                   #66
  70. _0000000e: movw    $0x0001,%ax                      #B8 01 00
  71. _00000011: movl    $0x00000001,%eax                 #B8 01 00 00 00
  72. _00000016: movl    (%ebx),%eax                      #8B 03
  73. _00000018: movl    0x02(%ebx,%esi,1),%eax           #8B 44 33 02
  74. _0000001c: movl    %edx,0x00002000(%ebx,%esi,1)     #89 94 33 00 20 00 00
  75. _00000023: call    _0000002d                        #E8 05 00 00 00
  76. _00000028: ja      _0000002c                        #77 02
  77. _0000002a: jmp     _00000000                        #EB D4
  78. _0000002c: ret                                      #C3
  79. _0000002d: movl    0x11111111,%eax                  #A1 11 11 11 11
  80.  
  81. ダンプデータ無しの出力は次のようになります。
  82.  
  83. TEST.O
  84. _00000000: nop
  85. _00000001: nop
  86. _00000002: movl    %cr0,%eax
  87. _00000005: movl    %cr2,%eax
  88. _00000008: movl    %cr3,%eax
  89. _0000000b: movb    $0x01,%al
  90. _0000000d: opsize
  91. _0000000e: movw    $0x0001,%ax
  92. _00000011: movl    $0x00000001,%eax
  93. _00000016: movl    (%ebx),%eax
  94. _00000018: movl    0x02(%ebx,%esi,1),%eax
  95. _0000001c: movl    %edx,0x00002000(%ebx,%esi,1)
  96. _00000023: call    _0000002d
  97. _00000028: ja      _0000002c
  98. _0000002a: jmp     _00000000
  99. _0000002c: ret
  100. _0000002d: movl    0x11111111,%eax
  101.  
  102. このフォーマットは、GASによる再アセンブルが簡単に(最小の変更で)行えるよ
  103. うに考えてあります。上の出力は、不用のニーモニック「opsize」を削除すればGA
  104. Sによってアセンブルが可能です。(使わないラベルも削除した方がよいのでしょう
  105. が。)
  106.  
  107.  
  108. ◆GAS形式のニーモニックについて
  109.  ここで、簡単にGASの表記法について説明します。GASの表記は、MASMな
  110. どとはかなり異なっている点がありますから注意して下さい。いちばん混乱し易いの
  111. は、オペランドの順番がソース、デスティネーションの順であり、MASMなどとは
  112. 逆になっている点です。以下に、相違点をまとめます。
  113.  ・ニーモニックの末尾に、オペランドのデータサイズを示す文字b/w/lを
  114.   付ける。b/w/lは、バイト/ワード/ダブルワードを表わす。
  115.  ・オペランドの順番は、ソース、デスティネーションの順である。
  116.  ・レジスタの名前には、先頭に%を付ける。
  117.  ・即値オペランドには、先頭に$を付ける。
  118.  私は、どういう場合にオペコード語尾のb,w,lを付けて、どういう場合に付け
  119. ないのかがよく分かっていません。したがって、この逆アセンブラが出力するニーモ
  120. ニックにもおかしな所がかなりあると思います。大体意味は分かるのでこれで我慢す
  121. るか、改良してまともな出力をするようにしてください。
  122.  
  123.  
  124. ◆著作権について
  125.  Cのソースコードについては完全にフリーとします。改良、改造も可です。実行プ
  126. ログラムについてはLSI-C86試食版の配布条件に従ってください。(手数料以
  127. 上の金銭の授受は禁じられている。)
  128.  
  129.  
  130. ◆私が参考にした文献
  131. 安藤寿茂(elfin)「gasマニュアル」GNU for TOWNS Rel.2
  132. 万木嘉弘「80386プログラマーズブック」新紀元社
  133.